﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NHibernate;
using schedulelist.ORM.dao.classes;
using schedulelist.ORM.dao.interfaces;
using schedulelist.ORM.domain;
using schedulelist.ORM.dao;

namespace schedulelist
{
    public partial class TicketsForm : System.Web.UI.Page
    {
        Interlayer Interlayer = new Interlayer(); 
        public static int id;
        public static string owner;
        public static string dm;
        public static string dd;
        public static string task;
        public static string status;
        public static string ex;
        public static string cust;
        public static string cat;
        public static string addinf;

        protected static int select = 0;// режим гетинга
        protected static string SelectedValue1, SelectedValue2, SelectedValue3, SelectedValue4;

        public static int index;//индекс изменяемой записи
        public static bool edit = false;//режим изменения
        public static bool quickadd = false;//режим быстрого добавления

        public static bool en_cat=false;
        public static bool en_inf=false;

        protected void Page_Load(object sender, EventArgs e){}
        
        //обработчик на обновление текущей страницы
        protected void Page_Prerender(object sender, EventArgs e)
        {
            if (Interlayer.getFactory().getUserDAO().getUserByLogin(Login.CurrentLog) == null)
            {
                Response.Redirect("~/Login.aspx");
            }
            DropDownList1.Items.Clear();
            foreach (Category c in Interlayer.getFactory().getCategoryDAO().GetAll())
            {
                //Добавляем в DropDownList роли все записи из таблиц "Category"
                DropDownList1.Items.Add(c.name);
            }
            DropDownList2.Items.Clear();
            foreach (Customer c1 in Interlayer.getFactory().getCustomerDAO().GetAll())
            {
                //Добавляем в DropDownList роли все записи из таблиц "Customer"
                DropDownList2.Items.Add(c1.name);
            }
            DropDownList3.Items.Clear();
            DropDownList4.Items.Clear();
            foreach (User u in Interlayer.getFactory().getUserDAO().GetAll())
            {//Добавляем в DropDownList роли все записи из таблиц "User" 
                DropDownList3.Items.Add(u.name);
                DropDownList4.Items.Add(u.name);
            }

            IRoleDAO rDAO1 = Interlayer.getFactory().getRoleDAO();
            //Получаем юзера по логину для проверки его прав
            Role r = rDAO1.getRoleByUserLogin(Login.CurrentLog);
            ITicketsDAO tDAO1 = Interlayer.getFactory().getTicketsDAO();
            //получаем все Tickets из базы
            IList<Tickets> t = tDAO1.GetAllwithSort("tickets", "dm");
            if (en_cat)
            {
                GridView1.Columns[8].Visible = true;
            }
            else { GridView1.Columns[8].Visible = false; }
            if (en_inf)
            {
                GridView1.Columns[9].Visible = true;
            }
            else { GridView1.Columns[9].Visible = false; }

            switch (select)
            {
                case 1:
                    //вывод всех юзеров по Category
                    tDAO1 = Interlayer.getFactory().getTicketsDAO();
                    Category c = Interlayer.getFactory().getCategoryDAO().getCategoryByName(SelectedValue1);
                    t = tDAO1.getTicketsByCat(c);
                    GridView1.DataSource = t;
                    GridView1.DataBind();
                    break;
                case 2:
                    //вывод всех юзеров по Customer
                    tDAO1 = Interlayer.getFactory().getTicketsDAO();
                    Customer c1 = Interlayer.getFactory().getCustomerDAO().getCustomerByName(SelectedValue2);
                    t = tDAO1.getTicketsByCust(c1);
                    GridView1.DataSource = t;
                    GridView1.DataBind();
                    break;
                case 3:
                    //вывод всех юзеров по Owner
                    tDAO1 = Interlayer.getFactory().getTicketsDAO();
                    User u = Interlayer.getFactory().getUserDAO().getUserByName(SelectedValue3);
                    t = tDAO1.getTicketsByOwner(u);
                    GridView1.DataSource = t;
                    GridView1.DataBind();
                    break;
                case 4:
                    //вывод всех юзеров по Executor
                    tDAO1 = Interlayer.getFactory().getTicketsDAO();
                    User u1 = Interlayer.getFactory().getUserDAO().getUserByName(SelectedValue4);
                    t = tDAO1.getTicketsByExecutor(u1);
                    GridView1.DataSource = t;
                    GridView1.DataBind();
                    break;
                default:
                    //и передаем их в GridView1 на вывод
                    GridView1.DataSource = t;
                    GridView1.DataBind();
                    break;
            }

            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                ((Label)(GridView1.Rows[i].Cells[2].FindControl("myLabel2"))).Text = (t[i].owner.name).ToString();
                ((Label)(GridView1.Rows[i].Cells[7].FindControl("myLabel7"))).Text = (t[i].ex.name).ToString();
                ((Label)(GridView1.Rows[i].Cells[8].FindControl("myLabel8"))).Text = (t[i].cust.name).ToString();
                ((Label)(GridView1.Rows[i].Cells[9].FindControl("myLabel9"))).Text = (t[i].cat.name).ToString();
                if (!(r.addt))//а есть ли у текущего юзера право на изменение/удаление тикетов?
                {
                    //нет
                    GridView1.Rows[i].Cells[10].Enabled = false;//изменение/удаление не разрешено
                }
                User logger = Interlayer.getFactory().getUserDAO().getUserByLogin(Login.CurrentLog);
                if (r.eot)//а есть ли у текущего юзера право на изменение/удаление тикетов?
                {
                    if (!((logger.Role.stat) /*& (logger.Dep.name == ownerInTbale.Dep.name)*/))
                    {
                        GridView1.Rows[i].Cells[10].Enabled = false;
                    }else{
                    //нет
                        GridView1.Rows[i].Cells[10].Enabled = true;
                    }
                    //изменение/удаление не разрешено
                }
                else{
                    //нет
                        GridView1.Rows[i].Cells[10].Enabled = false;
                    }
                //разрешаем изменять только свои тикеты
                string lab = ((Label)(GridView1.Rows[i].Cells[1].FindControl("myLabel2"))).Text;
                if (logger.name == lab | logger.Role.uedit | logger.Role.setstat)
                {
                    GridView1.Rows[i].Cells[10].Enabled = true;
                }

                if (r.addt)//а есть ли у текущего юзера право на изменение/удаление тикетов?
                {
                    //есть
                    Button1.Enabled = true;//добавление разрешено
                }
                else
                {
                    //нет
                    Button1.Enabled = false;//добавление не разрешено
                    Button9.Enabled = false;
                }

            }
                if (edit)
                {
                    IRoleDAO r1DAO1 = Interlayer.getFactory().getRoleDAO();
                    //Получаем юзера по логину для проверки его прав
                    Role rr = r1DAO1.getRoleByUserLogin(Login.CurrentLog);
                    if (!(rr.setstat))//а есть ли у текущего юзера право на setstat?
                    {
                        //GridViewRow row1 = GridView1.Rows[i];
                        GridView1.Rows[index].Cells[5].Enabled = false;
                    }
                    //убираем лейблы owner, ex, cust, cat, вместо них будут DropDownListы, очищаем их
                    ((Label)(GridView1.Rows[index].FindControl("myLabel2"))).Visible = false;
                    //((Label)(GridView1.Rows[index].FindControl("myLabel6"))).Visible = false;
                    ((Label)(GridView1.Rows[index].FindControl("myLabel7"))).Visible = false;
                    ((Label)(GridView1.Rows[index].FindControl("myLabel8"))).Visible = false;
                    ((Label)(GridView1.Rows[index].FindControl("myLabel9"))).Visible = false;
                    ((DropDownList)(GridView1.Rows[index].Cells[1].FindControl("DropDownList5"))).Visible = true;
                    ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList7"))).Visible = true;
                    ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList9"))).Visible = true;
                    ((DropDownList)(GridView1.Rows[index].Cells[7].FindControl("DropDownList11"))).Visible = true;
                    ((DropDownList)(GridView1.Rows[index].Cells[8].FindControl("DropDownList13"))).Visible = true;
                    ((DropDownList)(GridView1.Rows[index].Cells[1].FindControl("DropDownList5"))).Items.Clear();
                    ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList9"))).Items.Clear();
                    ((DropDownList)(GridView1.Rows[index].Cells[7].FindControl("DropDownList11"))).Items.Clear();
                    ((DropDownList)(GridView1.Rows[index].Cells[8].FindControl("DropDownList13"))).Items.Clear();
                    foreach (Category c in Interlayer.getFactory().getCategoryDAO().GetAll())
                    {
                        //Добавляем в DropDownList роли все записи из таблиц "Category"
                        ((DropDownList)(GridView1.Rows[index].Cells[7].FindControl("DropDownList13"))).Items.Add(c.name);
                    }
                    foreach (Customer c1 in Interlayer.getFactory().getCustomerDAO().GetAll())
                    {
                        //Добавляем в DropDownList роли все записи из таблиц "Customer"
                        ((DropDownList)(GridView1.Rows[index].Cells[8].FindControl("DropDownList11"))).Items.Add(c1.name);
                    }
                    foreach (User u in Interlayer.getFactory().getUserDAO().GetAll())
                    {
                        //Добавляем в DropDownList роли все записи из таблиц "User"
                        ((DropDownList)(GridView1.Rows[index].Cells[1].FindControl("DropDownList5"))).Items.Add(u.name);
                        ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList9"))).Items.Add(u.name);
                    }
                    for (int j = 0; j < GridView1.Rows.Count; j++)
                    {
                        if (j == index)
                        {
                            //находим нужную строчку по index
                            ((Button)(GridView1.Rows[j].Cells[10].FindControl("ibDelete"))).Visible = false;
                            ((Button)(GridView1.Rows[j].Cells[10].FindControl("Button7"))).Visible = false;
                            ((Button)(GridView1.Rows[j].Cells[10].FindControl("Button3"))).Visible = true;
                            ((Button)(GridView1.Rows[j].Cells[10].FindControl("Button2"))).Visible = true;
                            ((Button)(GridView1.Rows[j].Cells[10].FindControl("Button6"))).Visible = true;
                            //убираем с виду конпки "del", "edit"
                            //показываем кнопки "quicked","cancel","advanced ed"
                        }

                    }
                    //заполняем поля изменяемой записи ранее сохраненными
                    ((DropDownList)(GridView1.Rows[index].Cells[1].FindControl("DropDownList5"))).SelectedValue = owner;
                    ((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList9"))).SelectedValue = ex;
                    ((DropDownList)(GridView1.Rows[index].Cells[7].FindControl("DropDownList11"))).SelectedValue = cust;
                    ((DropDownList)(GridView1.Rows[index].Cells[8].FindControl("DropDownList13"))).SelectedValue = cat;
                    ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList7"))).SelectedValue = status;
                }

                if (quickadd)
                {
                    IRoleDAO r1DAO1 = Interlayer.getFactory().getRoleDAO();
                    //Получаем юзера по логину для проверки его прав
                    Role rr = r1DAO1.getRoleByUserLogin(Login.CurrentLog);
                    ((DropDownList)(GridView1.FooterRow.Cells[1].FindControl("DropDownList6"))).Items.Clear();
                    ((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList10"))).Items.Clear();
                    ((DropDownList)(GridView1.FooterRow.Cells[7].FindControl("DropDownList12"))).Items.Clear();
                    ((DropDownList)(GridView1.FooterRow.Cells[8].FindControl("DropDownList14"))).Items.Clear();
                    foreach (Category c in Interlayer.getFactory().getCategoryDAO().GetAll())
                    {
                        //Добавляем в DropDownList роли все записи из таблиц "Category"
                        ((DropDownList)(GridView1.FooterRow.Cells[7].FindControl("DropDownList14"))).Items.Add(c.name);
                    }
                    foreach (Customer c1 in Interlayer.getFactory().getCustomerDAO().GetAll())
                    {
                        //Добавляем в DropDownList роли все записи из таблиц "Customer"
                        ((DropDownList)(GridView1.FooterRow.Cells[8].FindControl("DropDownList12"))).Items.Add(c1.name);
                    }
                    foreach (User u in Interlayer.getFactory().getUserDAO().GetAll())
                    {
                        //Добавляем в DropDownList роли все записи из таблиц "User"
                        ((DropDownList)(GridView1.FooterRow.Cells[1].FindControl("DropDownList6"))).Items.Add(u.name);
                        ((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList10"))).Items.Add(u.name);
                    }
                    //в поле "owner" пихаем тек. юзера 
                    ((DropDownList)(GridView1.FooterRow.Cells[1].FindControl("DropDownList6"))).SelectedValue = Login.CurrentUser;
                    //в поле "ex" пихаем нуль-юзера 
                    ((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList10"))).SelectedValue =
                        Interlayer.getFactory().getUserDAO().getUserByName("-").name;
                    //запрет на изменение поля "owner"
                    ((DropDownList)(GridView1.FooterRow.Cells[1].FindControl("DropDownList6"))).Enabled = false;
                    //запрет на изменение поля "status"
                    ((DropDownList)(GridView1.FooterRow.Cells[5].FindControl("DropDownList8"))).Enabled = false;
                    //запрет на изменение поля "ex"
                    ((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList10"))).Enabled = false;
                    //запрет на изменение поля "dd"
                    ((TextBox)(GridView1.FooterRow.FindControl("myFooterTextBox4"))).Enabled = false;
                }

                quickadd = false;
                edit = false;
                select = 0;
        }
        //Отмена
        protected void Undo(object sender, EventArgs e)
        {
            Response.Redirect("~/TicketsForm.aspx");
        }

        //Добавление записи
        protected void ibInsert_Click(object sender, EventArgs e)
        {
            SiteMaster.add = true;//addmode
            SiteMaster.tabletype = 6;
            Response.Redirect("~/TempPage.aspx");
        }

        //Удаление записи
        protected void GridView1_RowDeleting(object sender,
        GridViewDeleteEventArgs e)
        {

            //получаем индекс удаляемой строки в GridView1
            int index = e.RowIndex;
            GridViewRow row = GridView1.Rows[index];
            //key - ключ, по которому ищется удаляемая запись в таблице tickets
            //здесь key - ID
            int key = Convert.ToInt16(((Label)(row.Cells[0].FindControl("myLabel1"))).Text);
            ITicketsDAO tDAO = Interlayer.getFactory().getTicketsDAO();
                Tickets t = tDAO.getTicketById(key);
                tDAO.Delete(t);
                IUserDAO uDAO = Interlayer.getFactory().getUserDAO();
                User u = uDAO.getUserByName(((Label)(row.Cells[1].FindControl("myLabel2"))).Text);
                u.cnt_created--;
                uDAO.SaveOrUpdate(u);
                Response.Redirect("~/TicketsForm.aspx");
            
        }



        //Изменение запис
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            edit = true;
            //получаем индекс изменяемой строки в GridView1 
            index = e.NewEditIndex;
            //storing current editing object's state
            id = Convert.ToInt32(((Label)(GridView1.Rows[index].Cells[0].FindControl("myLabel1"))).Text);
            owner = ((Label)(GridView1.Rows[index].Cells[1].FindControl("myLabel2"))).Text;
            dm = ((Label)(GridView1.Rows[index].Cells[2].FindControl("myLabel3"))).Text;
            dd = ((Label)(GridView1.Rows[index].Cells[3].FindControl("myLabel4"))).Text;
            task = ((Label)(GridView1.Rows[index].Cells[4].FindControl("myLabel5"))).Text;
            status = ((Label)(GridView1.Rows[index].Cells[5].FindControl("myLabel6"))).Text;
            ex = ((Label)(GridView1.Rows[index].Cells[6].FindControl("myLabel7"))).Text;
            cust = ((Label)(GridView1.Rows[index].Cells[8].FindControl("myLabel8"))).Text;
            cat = ((Label)(GridView1.Rows[index].Cells[9].FindControl("myLabel9"))).Text;
            addinf = ((Label)(GridView1.Rows[index].Cells[10].FindControl("myLabel10"))).Text;           
        }

        //обновление записи
        protected void Updating(object sender, EventArgs e)
        {
            //обновление записи после быстрого ее изменения
            ITicketsDAO tDAO = Interlayer.getFactory().getTicketsDAO();
            Tickets t = tDAO.getTicketById(id);
            IUserDAO uDAO = Interlayer.getFactory().getUserDAO();
            //запихиваем измененное в обьект
            t.owner = uDAO.getUserByName(((DropDownList)(GridView1.Rows[index].Cells[1].FindControl("DropDownList5"))).SelectedValue);
            t.dm = ((TextBox)(GridView1.Rows[index].Cells[2].FindControl("myTextBox3"))).Text;
            t.dd = ((TextBox)(GridView1.Rows[index].Cells[3].FindControl("myTextBox4"))).Text;
            t.task = ((TextBox)(GridView1.Rows[index].Cells[4].FindControl("myTextBox5"))).Text;
            t.status = ((DropDownList)(GridView1.Rows[index].Cells[5].FindControl("DropDownList7"))).SelectedValue;
            if (t.status == "Completed") {
                User u = uDAO.getUserByName(Login.CurrentUser);
                u.cnt_made++;
                uDAO.SaveOrUpdate(u);
            }
            t.ex = uDAO.getUserByName(((DropDownList)(GridView1.Rows[index].Cells[6].FindControl("DropDownList9"))).SelectedValue);
            ICustomerDAO cuDAO = Interlayer.getFactory().getCustomerDAO();
            t.cust = cuDAO.getCustomerByName(((DropDownList)(GridView1.Rows[index].Cells[7].FindControl("DropDownList11"))).SelectedValue);
            ICategoryDAO caDAO = Interlayer.getFactory().getCategoryDAO();
            t.cat = caDAO.getCategoryByName(((DropDownList)(GridView1.Rows[index].Cells[8].FindControl("DropDownList13"))).SelectedValue);
            t.addinf = ((TextBox)(GridView1.Rows[index].Cells[9].FindControl("myTextBox10"))).Text;
            tDAO.SaveOrUpdate(t);
            GridView1.EditIndex = -1;
            GridView1.ShowFooter = false;
            GridView1.DataBind();
            Response.Redirect("~/TicketsForm.aspx");
        }

        //расширенный режим изменения 
        protected void AED(object sender, EventArgs e)
        {
            SiteMaster.tabletype = 6;
            SiteMaster.add = false;//editmode
            Response.Redirect("~/TempPage.aspx");
        }
        //Быстрое добавление записи
        protected void QAD(object sender, EventArgs e)
        {
            //показываем доп. сторчку с пустыми текстбоксами
            //и кнопками "add" & "cancel"
            GridView1.ShowFooter = true;
            quickadd = true;
        }

        //обработчик на нажатие "add"
        protected void QuickAd(object sender, EventArgs e)
        {
            ITicketsDAO tDAO = Interlayer.getFactory().getTicketsDAO();
            Tickets t = new Tickets();
            //получаем с текстбоксов/DropDownListов значения
            //запихиваем сохраненное в обьект
            IUserDAO uDAO = Interlayer.getFactory().getUserDAO();
            User u = uDAO.getUserByName(Login.CurrentUser);
            u.cnt_created++;
            uDAO.SaveOrUpdate(u);
            t.owner = uDAO.getUserByName(((DropDownList)(GridView1.FooterRow.Cells[1].FindControl("DropDownList6"))).SelectedValue);
            t.dm = ((TextBox)(GridView1.FooterRow.Cells[2].FindControl("myFooterTextBox3"))).Text;
            t.dd = ((TextBox)(GridView1.FooterRow.Cells[3].FindControl("myFooterTextBox4"))).Text;
            t.task = ((TextBox)(GridView1.FooterRow.Cells[4].FindControl("myFooterTextBox5"))).Text;
            t.status = ((DropDownList)(GridView1.FooterRow.Cells[5].FindControl("DropDownList8"))).SelectedValue;
            t.ex = uDAO.getUserByName(((DropDownList)(GridView1.FooterRow.Cells[6].FindControl("DropDownList10"))).SelectedValue);
            ICustomerDAO cuDAO = Interlayer.getFactory().getCustomerDAO();
            t.cust = cuDAO.getCustomerByName(((DropDownList)(GridView1.FooterRow.Cells[7].FindControl("DropDownList12"))).SelectedValue);
            ICategoryDAO caDAO = Interlayer.getFactory().getCategoryDAO();
            t.cat = caDAO.getCategoryByName(((DropDownList)(GridView1.FooterRow.Cells[8].FindControl("DropDownList14"))).SelectedValue);
            t.addinf = ((TextBox)(GridView1.FooterRow.Cells[9].FindControl("myFooterTextBox10"))).Text;
            tDAO.SaveOrUpdate(t);
            Response.Redirect("~/TicketsForm.aspx");
            GridView1.ShowFooter = false;
        }

        protected void SelectByCat(object sender, EventArgs e)
        {
            select = 1;
            SelectedValue1 = DropDownList1.SelectedValue;
            Response.Redirect("~/TicketsForm.aspx");
        }

        protected void SelectByCust(object sender, EventArgs e)
        {
            select = 2;
            SelectedValue2 = DropDownList2.SelectedValue;
            Response.Redirect("~/TicketsForm.aspx");
        }

        //дальше описаны селекты
        protected void SelectByOwner(object sender, EventArgs e)
        {
            select = 3;
            SelectedValue3 = DropDownList3.SelectedValue;
            Response.Redirect("~/TicketsForm.aspx");
        }

        protected void SelectByExecutor(object sender, EventArgs e)
        {
            select = 4;
            SelectedValue4 = DropDownList4.SelectedValue;
            Response.Redirect("~/TicketsForm.aspx");
        }

        protected void ShowAll(object sender, EventArgs e)
        {
            Response.Redirect("~/TicketsForm.aspx");
        }
        //Изменение номера текущей страницы
        protected void GridView1_PageIndexChanging(object sender,
        GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            GridView1.EditIndex = -1;    //
            //GridView1.ShowFooter = true; //     Cancel() maybe...
            GridView1.DataBind();        //
        }
    }
}
